home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 12 / BBS in a box XII-1.iso / Files / Tele / C / Comet2.1.3.sit / Comet / DNR.c / DNR.c
Encoding:
C/C++ Source or Header  |  1991-05-23  |  5.3 KB  |  252 lines  |  [TEXT/MPS ]

  1. /*     DNR.c - DNR library for MPW
  2.  
  3.     (c) Copyright 1988 by Apple Computer.  All rights reserved
  4.     
  5. */
  6.  
  7. #include <OSUtils.h>
  8. #include <Errors.h>
  9. #include <Files.h>
  10. #include <Resources.h>
  11. #include <Memory.h>
  12. #include <Traps.h>
  13. #include <GestaltEqu.h>
  14. #include <Folders.h>
  15. #include <ToolUtils.h>
  16.  
  17. #define OPENRESOLVER    1
  18. #define CLOSERESOLVER    2
  19. #define STRTOADDR        3
  20. #define    ADDRTOSTR        4
  21. #define    ENUMCACHE        5
  22. #define ADDRTONAME        6
  23. #define    HINFO            7
  24. #define MXINFO            8
  25.  
  26. Handle codeHndl = nil;
  27.  
  28. typedef OSErr (*OSErrProcPtr)();
  29. OSErrProcPtr dnr = nil;
  30.  
  31.  
  32. TrapType GetTrapType(theTrap)
  33. unsigned long theTrap;
  34. {
  35.     if (BitAnd(theTrap, 0x0800) > 0)
  36.         return(ToolTrap);
  37.     else
  38.         return(OSTrap);
  39.     }
  40.     
  41. Boolean TrapAvailable(trap)
  42. unsigned long trap;
  43. {
  44. TrapType trapType = ToolTrap;
  45. unsigned long numToolBoxTraps;
  46.  
  47.     if (NGetTrapAddress(_InitGraf, ToolTrap) == NGetTrapAddress(0xAA6E, ToolTrap))
  48.         numToolBoxTraps = 0x200;
  49.     else
  50.         numToolBoxTraps = 0x400;
  51.  
  52.     trapType = GetTrapType(trap);
  53.     if (trapType == ToolTrap) {
  54.         trap = BitAnd(trap, 0x07FF);
  55.         if (trap >= numToolBoxTraps)
  56.             trap = _Unimplemented;
  57.         }
  58.     return(NGetTrapAddress(trap, trapType) != NGetTrapAddress(_Unimplemented, ToolTrap));
  59.  
  60. }
  61.  
  62. short GetCPanelFolder()
  63. {
  64.     short vRefNum = 0;
  65.     long dirID = 0;
  66.     SysEnvRec info;
  67.     Boolean hasFolderMgr = false;
  68.     long feature;
  69.     short wdRef;
  70.     
  71.     if (TrapAvailable(_GestaltDispatch)) if (Gestalt(gestaltFindFolderAttr, &feature) == noErr) hasFolderMgr = true;
  72.     if (!hasFolderMgr) {
  73.         SysEnvirons(1, &info);
  74.         return(info.sysVRefNum);
  75.         }
  76.     else {
  77.         if (FindFolder(kOnSystemDisk, kControlPanelFolderType, kDontCreateFolder, &vRefNum, &dirID) != noErr) return(0);
  78.         if (OpenWD(vRefNum, dirID, 'dnrp', &wdRef) == noErr)
  79.             return(wdRef);
  80.         else
  81.             return(0);
  82.         }
  83.     }
  84.  
  85. /* OpenOurRF is called to open the MacTCP driver resources */
  86.  
  87. short OpenOurRF()
  88. {
  89.     ParamBlockRec fi;
  90.     Str255 filename;
  91.     short vRefNum;
  92.     
  93.     vRefNum = GetCPanelFolder();
  94.     fi.fileParam.ioCompletion = nil;
  95.     fi.fileParam.ioNamePtr = &filename;
  96.     fi.fileParam.ioVRefNum = vRefNum;
  97.     fi.fileParam.ioFDirIndex = 1;
  98.     
  99.     while (PBGetFInfo(&fi, false) == noErr) {
  100.         /* scan system folder for driver resource files of specific type & creator */
  101.         if (fi.fileParam.ioFlFndrInfo.fdType == 'cdev' &&
  102.             fi.fileParam.ioFlFndrInfo.fdCreator == 'ztcp') {
  103.             /* found the MacTCP driver file */
  104.             return(OpenRFPerm(&filename, vRefNum, fsRdPerm));
  105.             }
  106.         /* check next file in system folder */
  107.         fi.fileParam.ioFDirIndex++;
  108.         }
  109.     return(-1);
  110.     }    
  111.  
  112.  
  113. OSErr OpenResolver(fileName)
  114. char *fileName;
  115. {
  116.     short refnum;
  117.     OSErr rc;
  118.     
  119.     if (dnr != nil)
  120.         /* resolver already loaded in */
  121.         return(noErr);
  122.         
  123.     /* open the MacTCP driver to get DNR resources. Search for it based on
  124.        creator & type rather than simply file name */    
  125.     refnum = OpenOurRF();
  126.  
  127.     /* ignore failures since the resource may have been installed in the 
  128.        System file if running on a Mac 512Ke */
  129.        
  130.     /* load in the DNR resource package */
  131.     codeHndl = GetIndResource('dnrp', 1);
  132.     if (codeHndl == nil) {
  133.         /* can't open DNR */
  134.         return(ResError());
  135.         }
  136.     
  137.     DetachResource(codeHndl);
  138.     if (refnum != -1) {
  139.         CloseWD(refnum);
  140.         CloseResFile(refnum);
  141.         }
  142.         
  143.     /* lock the DNR resource since it cannot be reloated while opened */
  144.     HLock(codeHndl);
  145.     dnr = (OSErrProcPtr) *codeHndl;
  146.     
  147.     /* call open resolver */
  148.     rc = (*dnr)(OPENRESOLVER, fileName);
  149.     if (rc != noErr) {
  150.         /* problem with open resolver, flush it */
  151.         HUnlock(codeHndl);
  152.         DisposHandle(codeHndl);
  153.         dnr = nil;
  154.         }
  155.     return(rc);
  156.     }
  157.  
  158.  
  159. OSErr CloseResolver()
  160. {
  161.     if (dnr == nil)
  162.         /* resolver not loaded error */
  163.         return(notOpenErr);
  164.         
  165.     /* call close resolver */
  166.     (void) (*dnr)(CLOSERESOLVER);
  167.  
  168.     /* release the DNR resource package */
  169.     HUnlock(codeHndl);
  170.     DisposHandle(codeHndl);
  171.     dnr = nil;
  172.     return(noErr);
  173.     }
  174.  
  175. OSErr StrToAddr(hostName, rtnStruct, resultproc, userDataPtr)
  176. char *hostName;
  177. struct hostInfo *rtnStruct;
  178. long resultproc;
  179. char *userDataPtr;
  180. {
  181.     if (dnr == nil)
  182.         /* resolver not loaded error */
  183.         return(notOpenErr);
  184.         
  185.     return((*dnr)(STRTOADDR, hostName, rtnStruct, resultproc, userDataPtr));
  186.     }
  187.     
  188. OSErr AddrToStr(addr, addrStr)
  189. unsigned long addr;
  190. char *addrStr;                                    
  191. {
  192.     if (dnr == nil)
  193.         /* resolver not loaded error */
  194.         return(notOpenErr);
  195.         
  196.     (*dnr)(ADDRTOSTR, addr, addrStr);
  197.     return(noErr);
  198.     }
  199.     
  200. OSErr EnumCache(resultproc, userDataPtr)
  201. long resultproc;
  202. char *userDataPtr;
  203. {
  204.     if (dnr == nil)
  205.         /* resolver not loaded error */
  206.         return(notOpenErr);
  207.         
  208.     return((*dnr)(ENUMCACHE, resultproc, userDataPtr));
  209.     }
  210.     
  211.     
  212. OSErr AddrToName(addr, rtnStruct, resultproc, userDataPtr)
  213. unsigned long addr;
  214. struct hostInfo *rtnStruct;
  215. long resultproc;
  216. char *userDataPtr;                                    
  217. {
  218.     if (dnr == nil)
  219.         /* resolver not loaded error */
  220.         return(notOpenErr);
  221.         
  222.     return((*dnr)(ADDRTONAME, addr, rtnStruct, resultproc, userDataPtr));
  223.     }
  224.  
  225.  
  226. extern OSErr HInfo(hostName, returnRecPtr, resultProc, userDataPtr)
  227. char *hostName;
  228. struct returnRec *returnRecPtr;
  229. long resultProc;
  230. char *userDataPtr;
  231. {
  232.     if (dnr == nil)
  233.         /* resolver not loaded error */
  234.         return(notOpenErr);
  235.         
  236.     return((*dnr)(HINFO, hostName, returnRecPtr, resultProc, userDataPtr));
  237.  
  238.     }
  239.     
  240. extern OSErr MXInfo(hostName, returnRecPtr, resultProc, userDataPtr)
  241. char *hostName;
  242. struct returnRec *returnRecPtr;
  243. long resultProc;
  244. char *userDataPtr;
  245. {
  246.     if (dnr == nil)
  247.         /* resolver not loaded error */
  248.         return(notOpenErr);
  249.         
  250.     return((*dnr)(MXINFO, hostName, returnRecPtr, resultProc, userDataPtr));
  251.  
  252.     };